#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QSerialPort>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>
#include <QTest>
#include <QTimer>

#include <QModbusTcpClient>
#include <QModbusDataUnit>
#include <QModbusReply>
#include <QHttpPart>
#include <QJsonObject>
#include <QJsonDocument>

#include <windows.h>


class MyThread : public QObject
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);
    ~MyThread();

    /** 通过串口名称Info创建串口对象 ; 处理完整帧结构并写入csv文件流*input_file ; 根据时间自变量*currentTime以及检测时间time判断是否结束 ; 传递采集帧结构的时刻*currentTime
    *
    *  @param:  Info            串口名称
    *  @param:  time            检测时间
    *  @param:  *input_file     帧写入的csv文件流
    *  @param:  *currentTime    时间自变量
    *  @return: void
    *  @note:   通过串口名称Info创建串口对象 ; 处理完整帧结构并写入csv文件流*input_file ; 根据时间自变量*currentTime以及检测时间time判断是否结束 ; 传递采集帧结构的时刻*currentTime
    *  @see:
    */
    void InitCSerialPort(QString Info,double time,QTextStream* input_file ,QTime* currentTime);
protected:


private:

    /** 将帧中的电容数据写入modbusTcp主机寄存器地址中
    *
    *  @param:  void
    *  @return: void
    *  @note:   将电容数据写入modbusTcp主机寄存器地址中
    *  @see:
    */
    void writeCapacitanceData();

    /** 从modbusTcp主机的单个寄存器地址中实时读取压力数据
    *
    *  @param:  void
    *  @return: void
    *  @note:   从modbusTcp主机的单个寄存器地址中实时读取压力数据
    *  @see:
    */
    void producingModBusData();

    /** 将当前完整帧data分别处理成QList<int>的压力数据和电容数据
    *
    *  @param:  data            当前完整帧
    *  @param:  *input_file     csv文件流
    *  @param:  time            时间自变量
    *  @return: void
    *  @note:  将当前完整帧data分别处理成QList<int>的压力数据和电容数据
    *  @see:
    */
    void dataProcessor(QString data,QTextStream* input_file,double time);

    /** 数据保存到CSV文件中 ; 将压力数据nine_pressure_data、电容数据effective_capacitance_data根据对应时间自变量timeX存入csv文件流*input_file中
    *
    *  @param:  nine_pressure_data            当前九点压力数据
    *  @param:  effective_capacitance_data    当前九点电容数据
    *  @param:  *input_file                   csv文件流
    *  @param:  timeX                         时间自变量
    *  @return: void
    *  @note:  将压力数据nine_pressure_data、电容数据effective_capacitance_data根据对应时间自变量timeX存入csv文件流*input_file中
    *  @see:
    */
    void save_csv_file(QList<int> nine_pressure_data,QList<int> effective_capacitance_data,QTextStream* input_file,double timeX);

    /** 处理成热力图需要的数据 ; 将原始压力数据nine_pressure_data由大到小排序得到nine_pressure_data_temp，并得到对应索引nine_pressure_data_list_original_location
    *
    *  @param:  nine_pressure_data            当前九点压力数据
    *  @return: void
    *  @note:  通过qSort将原始压力数据nine_pressure_data由大到小排序得到nine_pressure_data_temp，并得到对应索引nine_pressure_data_list_original_location
    *  @see:
    */
    void heatMapData(QList<int> nine_pressure_data);



    QString IP_address;

    QModbusTcpClient *My_client;
    QVector<float> DATA;
    bool TYPE = false;    //false为单点测量；ture为多点测量
    bool errorTYPE = false; //false为正确模式，ture为错误模式
    QString TOKEN;
    QString SaveFloder;
    QFile* modFile;
    QFileInfo* fileInfo;
    const QString uploadModFileApi = "/scanning/uploadFile/uploadModFile";  //ModBus文件上传
    const QString baseUrl = "http://localhost:8880";
//    const QString baseUrl = "http://121.36.217.102:8880";
    QNetworkReply *REPLY;
    QNetworkAccessManager *m_manager;

    /** 将modbusTCP采集到的寄存器数据通过HTTP传输到JAVA后端
    *
    *  @param:  void
    *  @return: void
    *  @note: 将modbusTCP采集到的寄存器数据通过HTTP传输到JAVA后端
    *  @see:
    */
    void HTTPWork();


public slots:

    /** 获取对应串口名称Info以及检测时间time并开始通信 ; public槽函数
    *
    *  @param:  Info    所选串口名称
    *  @param:  time    所填检测时间
    *  @return: void
    *  @note: 获取对应串口名称Info以及检测时间time并开始通信 ; public槽函数
    *  @see:
    */
    void devPortInfo(QString Info,double time);

    /** 判断时间是否停止 ; public槽函数
    *
    *  @param:  time        时间自变量
    *  @param:  time_type   true为时间开始;false为时间停止
    *  @return: void
    *  @note: 判断时间是否停止 ; public槽函数
    *  @see:
    */
    void obtainedTimeX(QTime* time,bool time_type);

    /** 传递IP地址,Type类型,token值,save_floder保存文件夹 ; public槽函数
    *
    *  @param:  IP              IP地址
    *  @param:  Type            true为多点采集;false为单点采集
    *  @param:  token           从后端得到的token
    *  @param:  save_floder     保存csv文件的文件夹
    *  @return: void
    *  @note: 传递IP地址,Type类型,token值,save_floder保存文件夹 ; public槽函数
    *  @see:
    */
    void recviceIP(QString IP,bool Type,QString token,QString save_floder);



signals:

    /** 发送读取到的蓝牙通信压力数据nine_pressure_data以及对应时刻timeX的信号
    *
    *  @param:  nine_pressure_data  压力数据
    *  @param:  timeX               时间自变量
    *  @return: void
    *  @note: 发送读取到的蓝牙通信压力数据nine_pressure_data以及对应时刻timeX的信号
    *  @see:
    */
    void emitSendData(QList<int> nine_pressure_data,double timeX);

    /** 发送通过modbusTCP将电容数据effective_capacitance_data传给主机的信号
    *
    *  @param:  effective_capacitance_data  电容数据
    *  @return: void
    *  @note: 发送通过modbusTCP将电容数据effective_capacitance_data传给主机的信号
    *  @see:
    */
    void emitCapacitanceData(QList<int> effective_capacitance_data);

    /** 通过modbusTCP读取40035寄存器位置数据
    *
    *  @param:  void
    *  @return: void
    *  @note: 通过modbusTCP读取40035寄存器位置数据
    *  @see:
    */
    void emitStandardPressure();

    /** 发送关闭scv文件的信号
    *
    *  @param:  void
    *  @return: void
    *  @note: 发送关闭scv文件的信号
    *  @see:
    */
    void emitCsvFileClose();

    /** 发送热力图需要数据(原始压力数据nine_pressure_data、由大到小排序后的压力数据索引nine_pressure_data_list_original_location、由大到小排序后的压力数据nine_pressure_data_temp)的信号
    *
    *  @param:  nine_pressure_data                          原始压力数据
    *  @param:  nine_pressure_data_list_original_location   由大到小排序后的压力数据索引
    *  @param:  nine_pressure_data_temp                     由大到小排序后的压力数据
    *  @return: void
    *  @note: 发送热力图需要数据的信号
    *  @see:
    */
    void emitHeatMap(QList<int> nine_pressure_data,QList<int> nine_pressure_data_list_original_location,QList<int> nine_pressure_data_temp);





    void ChartMOd(QVector<float>,QString);
    void errorClient();
    void errorData();
    void errorType();
    void errorUpload(QString);

private slots:
    void btnHoldingRegisters();
    void btnHoldingRegisters_2();
    void onReadReady();
    bool modbusStarting();
    void sendDATA();
    void uploadReply();

};

#endif // MYTHREAD_H
